package com.example.canvastouch2;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

public class MainActivity extends Activity {

	private CanvasView cv;							//	CanvasView
	private int 	curColor = Color.BLACK;			//	現在の色
	private int 	curWidth = 10;					//	現在の幅
	private boolean isPen = true;					//	ペン／消しゴムの切り替え 
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		//	CanvasViewの参照を取得
		cv = (CanvasView)findViewById(R.id.cv);
		Log.i("check", "onCreate");
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.option_menu, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		/*
		 * 	option_new		新規ページを準備する
		 * 	option_save		現在の表示を画像として保存する
		 * 	option_clear	現在の表示をクリアする
		 * 	option_color	線の色を選択する
		 * 	option_width	線の幅を選択する
		 * 	option_erase	消しゴムを使用する
		 */
		switch (item.getItemId()) {
			case R.id.option_new:
				this.setupNewPage();
				break;
			case R.id.option_save:
				this.saveToFile();
				break;
			case R.id.option_clear:
				this.clearAllPaths();
				break;
			case R.id.option_color:
				this.showColorPicker();
				break;
			case R.id.option_width:
				this.showWidthDialog();
				break;
			case R.id.option_erase_or_pen:
				switchPenAndEraser(item);
				break;
		}
		return true;
	}
	
	/**
	 * 	現在の表示をクリアする（ダイアログを表示して確認）
	 */
	private void clearAllPaths() {
		ClearDialogListener listener = new ClearDialogListener();
		
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setTitle("描画した線を全て消去します。");
		builder.setPositiveButton("OK", listener);
		builder.setNeutralButton("CANCEL", listener);
		builder.show();
	}
	
	/**
	 * 	[OK]が選択された場合、現在の表示をクリアする
	 */
	public class ClearDialogListener implements DialogInterface.OnClickListener {
		@Override
		public void onClick(DialogInterface dialog, int which) {
			if (which == DialogInterface.BUTTON_POSITIVE) {
				cv.clear();
			}
		}
	}
	
	/**
	 *	カラーピッカーを表示して、線の色を選択する
	 */
	private void showColorPicker() {
		ColorPickerDialog mColorPickerDialog = new ColorPickerDialog(
			this,   
			new ColorPickerDialog.OnColorChangedListener() {
				@Override    
				public void colorChanged(int color) {
					curColor = color;		//	現在の色を保存
					cv.setColor(color);		//	線の色を変更
				}  
			},  
			curColor
		);
		mColorPickerDialog.show();	
//		ColorSelectDialog dialog = new ColorSelectDialog(this);
//		dialog.show();
	}
	
	/**
	 * 	ダイアログを表示して、線の幅を指定する
	 */
	private void showWidthDialog() {
		WidthDialog dialog = new WidthDialog(
				this,
				new WidthDialogListener(),
				curWidth);
		dialog.show();
	}
	
	/**
	 * 	指定された線の幅を反映する
	 */
	public class WidthDialogListener implements WidthDialog.OnWidthChangedListener {
		@Override
		public void widthChanged(int width) {
			curWidth = width;				//	現在の幅を保存
			cv.setWidth(width);				//	線の幅を変更
		}
	}

	/**
	 * 	ペン、または、消しゴムに、機能を切り替える
	 * 
	 * 	@param item		選択されたメニューアイテム
	 */
	private void switchPenAndEraser(MenuItem item) {
		this.isPen = !this.isPen;
		if (this.isPen) {
			cv.setColor(curColor);					//	ペン（現在の色を設定）
			item.setTitle(R.string.option_erase);	//	メニューを消しゴムに切り替え
		}
		else {
			cv.setColor(Color.WHITE);				//	消しゴム（背景色で描画）
			item.setTitle(R.string.option_pen);		//	メニューをペンに切り替え
		}
	}
	
	/**
	 * 	イメージをキャプチャしてSDCARDに保存する
	 */
	@SuppressLint("SimpleDateFormat")
	private void saveToFile() {
        try {
        	/*
        	 * 	ファイル名		capture__yyyyMMdd_HHmmss.png
        	 * 	保存先		SDCARD/Pictures/
        	 */
        	SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
        		    "'capture'_yyyyMMdd_HHmmss'.png'");
        		String filename = simpleDateFormat.format(
        		    new Date(System.currentTimeMillis()));
        	String path = String.format("%s/%s/%s",
                    Environment.getExternalStorageDirectory().toString(),
                    "Pictures",
                    filename);
        	/*
        	 * 	保存する
        	 * 		PNG format
        	 * 		compress for max quality
        	 */
        	FileOutputStream out = new FileOutputStream(path);
            cv.setDrawingCacheEnabled(true);

            Bitmap bmp = Bitmap.createBitmap(cv.getDrawingCache());
            bmp.compress(CompressFormat.PNG, 100, out);
            out.close();
            
            Toast.makeText(
            		this, 
            		"保存しました。", 
            		Toast.LENGTH_LONG).show();
        }
        catch (FileNotFoundException e) {
        	e.printStackTrace();
        }
        catch (IOException e) {
        	e.printStackTrace();
        }
    }
	
	/**
	 * 	新しいページを準備する
	 * 
	 * 		現在のイメージを保存するか問い合わせる
	 */
	void setupNewPage() {
		SaveDialogListener listener = new SaveDialogListener();
		
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setTitle("保存しますか？");
		builder.setPositiveButton("保存する", listener);
		builder.setNegativeButton("破棄する", listener);
		builder.show();
	}
	
	/**
	 * 	新しいページを準備する
	 * 		
	 * 		現在のイメージを保存する（指示された場合）
	 * 		表示をクリアする
	 */
	public class SaveDialogListener implements DialogInterface.OnClickListener {
		@Override
		public void onClick(DialogInterface dialog, int which) {
			if (which == DialogInterface.BUTTON_POSITIVE) {
				saveToFile();
			}
			cv.clear();
		}
	}

	@Override
	protected void onPause() {
		super.onPause();
		Log.i("check", "onPause");
	}

	@Override
	protected void onStop() {
		super.onStop();
		Log.i("check", "onStop");
	}
}
